﻿using Microsoft.AspNetCore.Mvc;
using MVC高级教程.Service;
using System.Runtime.InteropServices.JavaScript;
using System.Text.Json.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace MVC高级教程.Controllers
{

    /// <summary>
    /// 获取已注册服务的方式
    ///     ①、构造函数注入
    ///     ②、通过请求上下文对象 Request.HttpContext.RequestServices
    ///     ③、使用[FromService]特性拿服务，（属于方法注入）
    /// </summary>
    public class GetServiceController : Controller
    {
        /**
    ★、服务提供者ServiceProvider类
        服务实例的创建、销毁均由serviceprovider负责维护，生成的服务一般不要执行服务对象的Dispose方法(如果有的话)，因为服务实力有可能被其他地方使用。
        当释放Serviceprovider对象时，该Provider会释放它生成的对象。
        在生成服务实例时，如果对象实现了IDispose接口，它会把该对象保存在disposeables列表中，当Provider释放时，当即会自动调用可释放对象的Dispose方法进行释放
        而ServicePrpvider本身又可以创建新的ServiceProvider对象，这样就相当于生成了一个作用域Scope
 **/


        //获取服务的方式：
        //①、由ServiceProvider通过构造函数注入
        public readonly IFoodService iFoodService;
        public GetServiceController(IFoodService foodService)
        {
            iFoodService = foodService;
          
        }

        //创建名为DisplayOrder的视图
        //视图方法名称一定要与视图文件名相同
        public IActionResult DisplayOrder()
        {
            //②、Requset.HttpContent中获取(只要出现ServiceProvider就能拿到服务)
            var foodservice = Request.HttpContext.RequestServices.GetService<IFoodService>();


            return View();
        }

        //③、使用[FromService]特性拿服务
        public IActionResult Hello([FromServices]IFoodService foodService)
        {
            return View();
        }



        //可以正常使JsonConvert进行序列化和反序列化
        public IActionResult Hello1(string a, int b)
        { 
            JObject result =JsonConvert.DeserializeObject<JObject>("{\"name\":\"1\"}");
            return Content(JsonConvert.SerializeObject(result));
        }


        /**
             .netDI服务的生命周期(注意Autofac注册的服务声明周期有所不同，种类也更多)
                     ①、瞬态：  Transient：每一次从ServiceProvider中取出都一个新的服务实例
                     ②、作用域单例：Scope：在同一个作用域下生成的实例相同，即同一个ServiceProvider对象获取的实例是同一个对象
                     ③、单例   Singleton ：从程序启动到程序结束，任意时刻请求服务，拿到的都是同一个对象

                    (作用域主要针对的是ServiceProvider对象的声明周期内，即在同一个ServiceProvider对象下，注册为Scope类型的对象为单例)

                     builder.Services.AddScoped<IFoodService, FoodService>();// (Scope)作用域模式
                     builder.Services.AddTransient<IFoodService, FoodService>();//(Transient)瞬态模式
                     builder.Services.AddSingleton<IFoodService, FoodService>();//(Singleton)单例模式
         **/


    }
}
